Ext.namespace('iOS.BaseView');

/*
 * view抽象类 ,一般的view都继承此类
 */
Ext.define('BaseView', {
    
    constructor: function(cfg){
        this.applyCfg(cfg);
        this._initDom();
        this._registerSelf();
        this.render();
        this._initView();
    },
    
    statics   : {
        SpaceType : 'space'
    },
    
    _objectId : null,
    /*
     * 每个View唯一的一个名字，对应为配置文件中的名字
     */
    _name     : null,

    /*
     * 本View节点选择符
     */
    _selector  : null,
    
    /*
     *  是否为隐藏
     */
    _isHidding : false,
    
    /*
     * 是否渲染完成
     */
    _isRendered: false,
    
    /*
     * 是否初始化完成 
     */
    _isInited  : false,
    
    /*
     * 将事件放于此可统一进行监听，注意事件执行函数名称必须和事件名称相同，
     * 并且作用域在当前作用域，若要改变作用域，请单独进行监听
     * 
     */
    _eventList : [],
    
    /*
     * 节点缓冲池,格式（选择符 ： jQuery节点）
     */
    _elCache : null,
    
    /*
     * 将自己注册到ViewManager中 
     */
    _registerSelf: function(){
        iOS.ViewManager.addView(this._name, this);
    },
    /*
     * 初始化view，可将常见的初始化信息在此配置
     */
    _initView: function(){
        if(this.self.BaseCls){
            this.getElCache().addClass(this.self.BaseCls);
        }
        if(this._isAbso){
            this.getElCacheByCls(this.self.ViewCls).css('position','absolute');
        }
    },
    /*
     * 初始化配置参数，所有config中的配置参数会加上_变成私有属性
     *      过滤掉方法
     */
    applyCfg: function(cfgs){
        if(!cfgs){
            return;
        }
        var that = this;
        $.each(cfgs, function(index, value){
            if(index == 'subViewCfg'){
                return;
            }
            that['_' + index] = value;
        });
    },
    
    /*
     * 生成HTML节点
     */
    _initInnerDom : function() {},
    
    _beforeRender: function(){
        this._initInnerDom();
    },
    
    /*
     * 渲染 
     */
    render: function(){
        this._beforeRender();
        this._attachEventListener();
        this._afterRender();
    },
    
    _afterRender: function(){
        this._isRendered     = true;
    },
    
    _initDom: function(){
        this._elCache = {}; 
    },
    
    /*
     * 侦听事件
     */
    _attachEventListener: function(){
        var eventList = this._eventList,
            that      = this,
            scope;
        for(var i = 0; i < eventList.length; i++){
            scope = eventList[i][1] || that;
            iOS.ViewManager.listen(scope, eventList[i][0], eventList[i][0], that);
        }
    },
    
    /*
     * 搜索本View缓冲池内的节点，若没有找到，那么去Dom中寻找，然后将缓冲元素存入缓冲池,
     *      提高多次查找同一节点的速度
     * @isForce,布尔值，是否强制更新节点，而不从缓冲池中寻找
     */
    getElCache : function(select, isForce){
        var sttc     = this.self,
            elCache  = this._elCache,
            selector = select || this._selector,
            $el;
        if(elCache[selector] && !isForce){
            $el      = elCache[selector];
        } else {
            $el = selector == this._selector ? $(selector) : $(this._selector).find(selector);
            this._elCache[selector] = $el;
        }
        return $el;
    },
    /*
     * 仅会在本view范围内搜索节点
     */
    getElCacheByCls: function(cls, isForce){
        cls = '.' + cls;
        return this.getElCache(cls, isForce);
    },
    /*
     * 移出节点缓冲池中的节点
     */
    removeElCache: function(selector){
        this._elCache[selector] = null;
    },
    /*
     * 隐藏本View，同时作出标记
     */
    hide: function(){
        $(this._selector).hide();
        this._markHide();
    },
    
    show: function(){
        $(this._selector).show();
        this._markShow();
    },
    
    /*
     * @flex:给定一个flex，然后生成相应css字符串 ,仅简化操作 
     */
    _getFlex: function(flex){
        return '-webkit-box-flex:' + flex;
    },

    _getTranslate: function(x, y){
        return '-webkit-transform: translate3d(' + x + 'px, ' + y + 'px, 0)';
    },
    
    _markHide: function(){
        this.isHidding = true;
    },
    
    _markShow: function(){
        this.isHidding = false;
    },
    
    getObjectId : function(){
        return this._objectId;
    },
    
    /*
     * 获得指定元素-webkit-transform的translate属性
     */
    getTranslate : function(el){
        var $el       = $(el),
            reg       = /\d+\.?\d?/g;
            transform = $el.css('-webkit-transform'),
            transArr  = transform.match(reg),
            length    = transArr.length,
            pos       = {},
            indexX    = 4,
            indexY    = 5;
        if(transform.indexOf('3d') > 0){
            indexX    = 13;
            indexY    = 14;
        }
        pos           = {
            x  : parseInt(transArr[indexX]),
            y  : parseInt(transArr[indexY])
        };
        return pos;
    },

    getScale: function(el){
        var $el       = $(el),
            reg       = /\d+\.?\d?/g,
            transform = $el.css('-webkit-transform').match(/\([^]+\)/g)[0].replace(/[\(\)]/g, ""),
            transArr  = transform.match(reg),
            length    = transArr.length;
        return transArr[0];
    }, 
    
    /*
     * @FIXME: 目前仅保留translate，scale，日后需要时添加。
     * 添加transform属性，不会覆盖之前的transform属性.
     * 由于transform属性不能单个获取，只能以字符串形式获得。
     * @transforms: transform的属性，字符串，例如scale(1)，或者是数组，包含一组transform的值
     */
    addTransform: function(el, transforms){
        var $el       = $(el),
            translate = this.getTranslate($el),
            transform = [],
            scale     = this.getScale($el) || 1;
        if(typeof transforms != 'object'){
            transform     = 
                'translate3d(' + translate.x + 'px, ' + translate.y + 'px, 0) ' +
                'scale3d(' + scale + ', ' + scale + ', ' + scale + ')' +
                transforms;    
        } else {
            transform = ' translate3d(' + translate.x + 'px, ' + translate.y + 'px, 0)' + transforms;
        }
        $el[0].style.webkitTransform = transform;
    },

    _test : function(){
        console.log("baseView-----test");
    }
});

iOS.BaseView.BaseView = BaseView;